Dart _fe_analyzer_shared scanner AbstractScanner bigSwitch

bigSwitchAbstractScanner 类中的一个方法,它的主要任务是处理源代码中的各种字符,并将它们转换为相应的词素。

int bigSwitch(int next) {
  // 首先,它调用 `beginToken` 方法来开始一个新的词素。
  beginToken();
  // 然后,它检查下一个字符是否是空格、制表符、换行符或回车符。
  // 如果是,它会调用 `appendWhiteSpace` 方法来处理这些空白字符,
  // 并快速跳过连续的空格字符。
  if (identical(next, $SPACE) ||
      identical(next, $TAB) ||
      identical(next, $LF) ||
      identical(next, $CR)) {
    appendWhiteSpace(next);
    next = advance();
    // 并快速跳过连续的空格字符。
    while (identical(next, $SPACE)) {
      next = advance();
    }
    return next;
  }

  int nextLower = next | 0x20;

  // `$a`和`$z`是两个常量,分别表示小写字母'a'和'z'的 ASCII 值。
  // `nextLower` 是下一个字符的小写形式的 ASCII 值。
  // 这个 `if` 语句检查下一个字符是否是小写字母。
  if ($a <= nextLower && nextLower <= $z) {
    // 如果下一个字母是'r'进if,'r'有什么特殊含义?
    // 在 Dart 中,原始字符串是以 'r' 开头的字符串,例如 `r"This is a raw string"`。
    if (identical($r, next)) {
      return tokenizeRawStringKeywordOrIdentifier(next);
    }
    return tokenizeKeywordOrIdentifier(next, /* allowDollar = */ true);
  }

  // 关括号
  if (identical(next, $CLOSE_PAREN)) {
    return appendEndGroup(TokenType.CLOSE_PAREN, OPEN_PAREN_TOKEN);
  }

  // 开括号
  if (identical(next, $OPEN_PAREN)) {
    appendBeginGroup(TokenType.OPEN_PAREN);
    return advance();
  }

  // 分号
  if (identical(next, $SEMICOLON)) {
    appendPrecedenceToken(TokenType.SEMICOLON);
    // Type parameters and arguments cannot contain semicolon.
    discardOpenLt();
    return advance();
  }

  // 点
  if (identical(next, $PERIOD)) {
    return tokenizeDotsOrNumber(next);
  }

  // 逗号
  if (identical(next, $COMMA)) {
    appendPrecedenceToken(TokenType.COMMA);
    return advance();
  }

  // 等于号
  if (identical(next, $EQ)) {
    return tokenizeEquals(next);
  }

  // 花括号关
  if (identical(next, $CLOSE_CURLY_BRACKET)) {
    return appendEndGroup(
        TokenType.CLOSE_CURLY_BRACKET,
        OPEN_CURLY_BRACKET_TOKEN);
  }

  // 斜杠
  if (identical(next, $SLASH)) {
    return tokenizeSlashOrComment(next);
  }

  // 花括号开
  if (identical(next, $OPEN_CURLY_BRACKET)) {
    appendBeginGroup(TokenType.OPEN_CURLY_BRACKET);
    return advance();
  }

  // 双引号、单引号
  if (identical(next, $DQ) || identical(next, $SQ)) {
    return tokenizeString(next, scanOffset, /* raw = */ false);
  }

  // 下划线
  if (identical(next, $_)) {
    return tokenizeKeywordOrIdentifier(next, 
    /* allowDollar = */ true);
  }

  // 双引号
  if (identical(next, $COLON)) {
    appendPrecedenceToken(TokenType.COLON);
    return advance();
  }

  // 小于号
  if (identical(next, $LT)) {
    return tokenizeLessThan(next);
  }

  // 大于号
  if (identical(next, $GT)) {
    return tokenizeGreaterThan(next);
  }

  // 叹号
  if (identical(next, $BANG)) {
    return tokenizeExclamation(next);
  }

  // 方括号开
  if (identical(next, $OPEN_SQUARE_BRACKET)) {
    return tokenizeOpenSquareBracket(next);
  }

  // 方括号关
  if (identical(next, $CLOSE_SQUARE_BRACKET)) {
    return appendEndGroup(
        TokenType.CLOSE_SQUARE_BRACKET, 
        OPEN_SQUARE_BRACKET_TOKEN);
  }

  // @
  if (identical(next, $AT)) {
    return tokenizeAt(next);
  }

  // 数字
  if (next >= $1 && next <= $9) {
    return tokenizeNumber(next);
  }

  // &
  if (identical(next, $AMPERSAND)) {
    return tokenizeAmpersand(next);
  }

  // 0
  if (identical(next, $0)) {
    return tokenizeHexOrNumber(next);
  }

  // 问号
  if (identical(next, $QUESTION)) {
    return tokenizeQuestion(next);
  }

  // |
  if (identical(next, $BAR)) {
    return tokenizeBar(next);
  }

  // +
  if (identical(next, $PLUS)) {
    return tokenizePlus(next);
  }

  // $
  if (identical(next, $)) {
    return tokenizeKeywordOrIdentifier(next, 
    /* allowDollar = */ true);
  }

  // -
  if (identical(next, $MINUS)) {
    return tokenizeMinus(next);
  }

  // *
  if (identical(next, $STAR)) {
    return tokenizeMultiply(next);
  }

  // ^
  if (identical(next, $CARET)) {
    return tokenizeCaret(next);
  }

  // 波浪符(~)
  if (identical(next, $TILDE)) {
    return tokenizeTilde(next);
  }

  // %
  if (identical(next, $PERCENT)) {
    return tokenizePercent(next);
  }

  // 反引号(`)
  if (identical(next, $BACKPING)) {
    appendPrecedenceToken(TokenType.BACKPING);
    return advance();
  }

  // 反斜杠(\)
  if (identical(next, $BACKSLASH)) {
    appendPrecedenceToken(TokenType.BACKSLASH);
    return advance();
  }

  // 井号(#)
  if (identical(next, $HASH)) {
    return tokenizeTag(next);
  }

  if (next < 0x1f) {
    return unexpected(next);
  }

  // unicode 处理
  next = currentAsUnicode(next);

  return unexpected(next);
}

本文作者:Maeiee

本文链接:Dart _fe_analyzer_shared scanner AbstractScanner bigSwitch

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!